package com.ruoyi.framework.web.service;

import cn.dev33.satoken.stp.StpUtil;
import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.utils.ServletUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.ip.AddressUtils;
import com.ruoyi.common.utils.ip.IpUtils;
import eu.bitwalker.useragentutils.UserAgent;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * token验证处理
 *
 * @author ruoyi
 */
@Slf4j
@Component
public class TokenService {

    /**
     * 获取用户身份信息
     *
     * @return 用户信息
     */
    public LoginUser getLoginUser() {
        Object currUser = StpUtil.getTokenSession().get(UserConstants.LOGIN_USER);
        if (currUser instanceof LoginUser) {
            return (LoginUser) currUser;
        }
        return null;
    }


    /**
     * 设置用户身份信息
     */
    public void setLoginUser(LoginUser loginUser) {
        if (StringUtils.isNotNull(loginUser)) {
//            refreshToken(loginUser);
            StpUtil.getTokenSession().set(UserConstants.LOGIN_USER, loginUser);
            StpUtil.renewTimeout(StpUtil.getStpLogic().getConfigOrGlobal().getTimeout());
        }
    }

    /**
     * 删除用户身份信息
     */
    public void delLoginUser(String token) {
        if (StringUtils.isNotEmpty(token)) {
            StpUtil.getTokenSessionByToken(token).logout();
//            String userKey = getTokenKey(token);
//            redisCache.deleteObject(userKey);
        }
    }

    /**
     * 创建令牌
     *
     * @param loginUser 用户信息
     * @return 令牌
     */
    public String createToken(LoginUser loginUser) {
        setUserAgent(loginUser);
        StpUtil.login(loginUser.getUserId(), loginUser.getOperatorType().name());
        StpUtil.getTokenSession().set(UserConstants.LOGIN_USER, loginUser);
        return StpUtil.getTokenValue();
    }


    /**
     * 设置用户代理信息
     *
     * @param loginUser 登录信息
     */
    public void setUserAgent(LoginUser loginUser) {
        UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent"));
        String ip = IpUtils.getIpAddr();
        loginUser.setIpaddr(ip);
        loginUser.setLoginLocation(AddressUtils.getRealAddressByIP(ip));
        loginUser.setBrowser(userAgent.getBrowser().getName());
        loginUser.setOs(userAgent.getOperatingSystem().getName());
    }

}
